﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static CommonModel.Model.DataTypeDll;

namespace CommonModel.Util
{
    public class BytesParseToTypeString
    {
        //由于源端发送的数据都是 LittleEndian 此方法中默认优先以 LittleEndian 解析<br/>
        //即 float 以 floatEndian 解析
        public static string ParseValue(DataType type, byte[] data)
        {
            if (null == data || data.Length == 0)
            {
                return "";
            }
            string valueStr = "";
            int valueInt = 0;

            try
            {
                switch (type)
                {
                    // 1 字节
                    case DataType.BIT:
                        valueInt = TransForm.ByteToUint8(data);
                        valueStr = valueInt.ToString();
                        break;
                    case DataType.BITARRAY:
                        // valueInt = TransForm.ByteToUint8(data);
                        // valueStr = string.valueOf(valueInt);
                        break;
                    case DataType.BYTE:
                        valueStr = TransForm.ByteToUint8(data).ToString();
                        break;
                    case DataType.CHAR:
                        valueStr = TransForm.ByteToIntBigEndian(data).ToString();
                        break;
                    case DataType.UCHAR:
                        valueStr = TransForm.ByteToUint8(data).ToString();
                        break;
                    case DataType.BOOL:
                        valueInt = TransForm.ByteToUint8(data);
                        valueStr = valueInt.ToString();
                        break;
                    case DataType.ENUM:
                        valueInt = TransForm.ByteToUint8(data);
                        valueStr = valueInt.ToString();
                        break;
                    case DataType.UINT8:
                        valueStr = TransForm.ByteToUint8(data).ToString();
                        break;
                    // 2 字节
                    case DataType.UINT16:
                        valueStr = TransForm.ByteToUint16(data).ToString();
                        break;
                    case DataType.UINT16REF:
                        valueStr = TransForm.ByteToUint16BigEndian(data).ToString();
                        break;
                    case DataType.SHORT:
                        valueStr = TransForm.ByteToShort(data).ToString();
                        break;
                    case DataType.SHORTREF:
                        valueStr = TransForm.ByteToShortBigEndian(data).ToString();
                        break;
                    // 4 字节
                    case DataType.INT:
                        valueStr = TransForm.ByteToInt(data).ToString();
                        break;
                    case DataType.INTREF:
                        valueStr = TransForm.ByteToIntBigEndian(data).ToString();
                        break;
                    case DataType.UINT:
                        valueStr = TransForm.ByteToUint32(data).ToString();
                        break;
                    case DataType.UINTREF:
                        valueStr = TransForm.ByteToUint32BigEndian(data).ToString();
                        break;
                    case DataType.FLOAT:
                        valueStr = string.Format("{0:0.000}", TransForm.ByteToFloat(data));//结果是0.000的形式
                        break;
                    case DataType.FLOATREF:
                        valueStr = string.Format("{0:0.000}", TransForm.ByteToFloatBigEndian(data));
                        break;
                    case DataType.UINT32:
                        valueStr = TransForm.ByteToUint32(data).ToString();
                        break;
                    case DataType.UINT32REF:
                        valueStr = TransForm.ByteToUint32BigEndian(data).ToString();
                        break;
                    case DataType.IPV4:
                        valueStr = TransForm.ByteToIp(data);//函数未实现
                        break;
                    case DataType.IPV4_4:
                        valueStr = TransForm.FourByteToIp(data);//函数未实现
                        break;
                    // 8 字节
                    case DataType.LONG:
                        valueStr = TransForm.ByteToLong(data).ToString();
                        break;
                    case DataType.LONGREF:
                        valueStr = TransForm.ByteToLongBigEndian(data).ToString();
                        break;
                    case DataType.DOUBLE:
                        valueStr = TransForm.ByteToDouble(data).ToString();
                        break;
                    case DataType.DOUBLEREF:
                        valueStr = TransForm.ByteToDoubleBigEndian(data).ToString();
                        break;
                    // 特殊 类型
                    case DataType.DATE:
                        valueStr = TransForm.ByteToDate(data).ToString();
                        break;
                    case DataType.DATESHORT:
                        valueStr = TransForm.ByteToDateShort(data).ToString();
                        break;
                    case DataType.BITOP:
                        valueStr = TransForm.bytesToBitOp(data).ToString();
                        break;
                    case DataType.BYTEOP:
                        valueStr = TransForm.bytesToByteOp(data).ToString();
                        break;
                    case DataType.USHORTOP:
                        valueStr = TransForm.bytesToUShortOp(data).ToString();
                        break;
                    case DataType.SINGLEOP:
                        valueStr = TransForm.bytesToSingleOp(data).ToString();
                        break;
                    case DataType.SCHEDULE:
                        valueStr = TransForm.bytesToSchedule(data).ToString();
                        break;
                    case DataType.AUTOMSGCFG:
                        valueStr = TransForm.bytesToAutoMsgCfg(data).ToString();
                        break;
                    case DataType.CONTREAD:
                        valueStr = TransForm.bytesToContRead(data).ToString();
                        break;
                    case DataType.MAC:
                        valueStr = TransForm.bytesToMac(data).ToString();
                        break;
                    case DataType.MultipathData:// 多径数据
                        valueStr = TransForm.bytesToMultipathData(data).ToString();
                        break;
                    // n 字节
                    case DataType.STRUCT:
                        break;
                    case DataType.STRING:
                        valueStr = TransForm.ByteToStringUTF8(data);
                        break;
                    case DataType.HEXSTR:
                        // DecimalFormat decimalFormat = new DecimalFormat("#0.000");
                        valueStr = TransForm.ByteToHexStringBigEndian(data);
                        break;
                    case DataType.HEXSTRREF:
                        // DecimalFormat decimalFormat = new DecimalFormat("#0.000");
                        valueStr = TransForm.ByteToHexStringBigEndian(data);//大端
                        break;
                    case DataType.UNKOWN:
                        valueStr = "占位";
                        break;
                    default:
                        valueStr = "";
                        break;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception caught: {0}", e);
            }
            return valueStr;
        }
    }
}
